package cn.itcast.service;

import cn.itcast.config.WebSocketConfig;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.stereotype.Component;

import javax.websocket.*;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.AtomicInteger;


//@ServerEndpoint("/pay/status/{ip}")
@ConditionalOnClass(value = WebSocketConfig.class)
@Slf4j
@ServerEndpoint("/pay/status/{ip}")
@Component
public class WebSocketServer {


    private static Map<String, Session> clients = new ConcurrentHashMap<>();

    @OnOpen
    public void onOpen(Session session) {
        log.info("有新的客户端连接了: {}", session.getId());
        //将新用户存入在线的组
        clients.put(session.getId(), session);
    }

    @OnClose
    public void onClose(Session session) {
        log.info("有用户断开了, id为:{}", session.getId());
        //将掉线的用户移除在线的组里
        clients.remove(session.getId());
    }

    @OnError
    public void onError(Throwable throwable) {
        throwable.printStackTrace();
    }

    @OnMessage
    public void onMessage(String message) {
        log.info("服务端收到客户端发来的消息: {}", message);
        System.out.println("服务端收到客户端发来的消息: {}, " + message);
        this.sendAll(message);
    }


    private void sendAll(String message) {
        for (Map.Entry<String, Session> sessionEntry : clients.entrySet()) {
            sessionEntry.getValue().getAsyncRemote().sendText(message);
        }

    }

//    //静态变量，用来记录当前在线连接数。应该把它设计成线程安全的。
//    private static AtomicInteger onlineNum = new AtomicInteger();
//
//    //concurrent包的线程安全Set，用来存放每个客户端对应的WebSocketServer对象。
//    private static ConcurrentHashMap<String, Session> sessionPools = new ConcurrentHashMap<>();
//
//    //发送消息
//    public void sendMessage(Session session, String message) throws IOException {
//        if (session != null) {
//            synchronized (session) {
////                System.out.println("发送数据：" + message);
//                session.getBasicRemote().sendText(message);
//            }
//        }
//    }
//
//    //给指定用户发送信息
//    public void sendInfo(String userName, String message) {
//        Session session = sessionPools.get(userName);
//        try {
//            sendMessage(session, message);
//        } catch (Exception e) {
//            e.printStackTrace();
//        }
//    }
//
//    //建立连接成功调用
//    @OnOpen
//    public void onOpen(Session session, @PathParam(value = "sid") String userName) {
//        sessionPools.put(userName, session);
//        addOnlineCount();
//        System.out.println(userName + "加入webSocket！当前人数为" + onlineNum);
//        try {
//            sendMessage(session, "欢迎" + userName + "加入连接！");
//        } catch (IOException e) {
//            e.printStackTrace();
//        }
//    }
//
//    //关闭连接时调用
//    @OnClose
//    public void onClose(@PathParam(value = "sid") String userName) {
//        sessionPools.remove(userName);
//        subOnlineCount();
//        System.out.println(userName + "断开webSocket连接！当前人数为" + onlineNum);
//    }
//
//    //收到客户端信息
//    @OnMessage
//    public void onMessage(String message) throws IOException {
//        message = "客户端：" + message + ",已收到";
//        System.out.println(message);
//        for (Session session : sessionPools.values()) {
//            try {
//                sendMessage(session, message);
//            } catch (Exception e) {
//                e.printStackTrace();
//                continue;
//            }
//        }
//    }
//
//    //错误时调用
//    @OnError
//    public void onError(Session session, Throwable throwable) {
//        System.out.println("发生错误");
//        throwable.printStackTrace();
//    }
//
//    public static void addOnlineCount() {
//        onlineNum.incrementAndGet();
//    }
//
//    public static void subOnlineCount() {
//        onlineNum.decrementAndGet();
//    }
}
